{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import panel as pn\n",
    "\n",
    "from panel.widgets import Tqdm\n",
    "\n",
    "pn.extension()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The ``Tqdm`` indicator wraps the well known [`tqdm`](https://github.com/tqdm/tqdm) progress indicator and displays the progress towards some target. You can use it in the notebook or in your Panel web app.\n",
    "\n",
    "[![Tqdm](https://raw.githubusercontent.com/tqdm/tqdm/master/images/logo.gif)](https://github.com/tqdm/tqdm)\n",
    "\n",
    "#### Parameters:\n",
    "\n",
    "* **``layout``** (Column or Row): The layout of the `progress` indicator and the `text_pane`.\n",
    "* **``max``** (int): The maximum progress value.\n",
    "* **``progress``** (Progress): The Progress indicator to display the progress on.\n",
    "* **``text``** (int): The current text being output by tqdm.\n",
    "* **``text_pane``** (Str): The Pane displaying the progress `text`.\n",
    "* **``value``** (int or None): The current value towards the progress.\n",
    "* **``write_to_console``** (bool): Whether or not to also write to the console, only works on server.\n",
    "\n",
    "For details on other options for customizing the component see the [layout](../../how_to/layout/index.md) and [styling](../../how_to/styling/index.md) how-to guides. For a general introduction to `tqdm` and lots of examples checkout the [tqdm github page](https://github.com/tqdm/tqdm).\n",
    "\n",
    "___"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To use the `Tqdm` indicator instantiate the object and then use the resulting variable just like you would use `tqdm.tqdm`, i.e. you can iterate over any iterable:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "tqdm = Tqdm()\n",
    "\n",
    "def run_loop(*events, timeout=0.2):\n",
    "    for i in tqdm(range(0,10), desc=\"My loop bar\", leave=True, colour='#666666'):\n",
    "        if pn.state._is_pyodide:\n",
    "            # time.sleep does not work in pyodide\n",
    "            np.random.random((10**6, 30))  \n",
    "        else:\n",
    "            time.sleep(timeout)\n",
    "        \n",
    "tqdm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Most of the [parameters supported by tqdm](https://github.com/tqdm/tqdm#parameters) can be passed to the call method of the `Tqdm` indicator. \n",
    "\n",
    "Click the button below to see the progress bar update (if you viewing this on a live kernel):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "button = pn.widgets.Button(name=\"Run Loop\", button_type=\"success\")\n",
    "button.on_click(run_loop)\n",
    "button"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Nesting\n",
    "\n",
    "When nesting `Tqdm` indicators using the `margin` parameter allows visually indicating the level of nesting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "tqdm_outer = Tqdm()\n",
    "tqdm_inner = Tqdm(margin=(0, 0, 0, 20))\n",
    "\n",
    "def run_nested_loop(*events, timeout=0.05):\n",
    "    for i in tqdm_outer(range(10)):\n",
    "        for j in tqdm_inner(range(10)):\n",
    "            if pn.state._is_pyodide:\n",
    "                # time.sleep does not work in pyodide\n",
    "                np.random.random((10**6, 30))  \n",
    "            else:\n",
    "                time.sleep(timeout)\n",
    "            \n",
    "run_nested_loop(timeout=0.01)\n",
    "\n",
    "pn.Column(tqdm_outer, tqdm_inner)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "button = pn.widgets.Button(name=\"Run Nested Loop\", button_type=\"success\")\n",
    "button.on_click(run_nested_loop)\n",
    "button"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pandas\n",
    "\n",
    "To use the tqdm pandas integration you can activate it by calling `tqdm.pandas` with all the configuration options. Once activated the `progress_apply` method is available on a `pandas.DataFrame`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "tqdm_pandas = Tqdm(width=500)\n",
    "\n",
    "# Register Pandas. This gives DataFrame.progress_apply method\n",
    "tqdm_pandas.pandas(desc=\"Pandas Progress\")\n",
    "\n",
    "df = pd.DataFrame(np.random.randint(0, 100, (100000, 600)))\n",
    "\n",
    "def run_df(*events):\n",
    "    df.progress_apply(lambda x: x**2)\n",
    "    \n",
    "run_df()\n",
    "\n",
    "tqdm_pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pandas_button = pn.widgets.Button(name=\"Run Pandas Apply\", button_type=\"success\")\n",
    "pandas_button.on_click(run_df)\n",
    "pandas_button"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
